var defaultStyle = new ol.style.Style({ fill: new ol.style.Fill({ color: 'rgba(0, 255, 0, 0.1)' }), stroke: new ol.style.Stroke({ color: 'rgba(0, 255, 0, 1)', width: 4 }), image: new ol.style.Circle({ radius: 5, fill: new ol.style.Fill({ color: 'rgba(0, 255, 0, 0.7)' }), stroke: new ol.style.Stroke({ color: 'rgba(0, 255, 0, 1)', width: 1 }), }) }); //Add layers with features that will be projected on the image function addProjectionLayers() { //some features to project var point = new ol.Feature(new ol.geom.Point([2120050.997001601, 6025134.1240540715])); var line = new ol.Feature(new ol.geom.LineString([[2120066.7758608386, 6025129.492230156], [2120082.3013773034, 6025139.587551411]])); var polygon = new ol.Feature(new ol.geom.Polygon([[[2120066.782223294, 6025144.500999055], [2120059.590256579, 6025117.872541881], [2120050.816009205, 6025192.095483984], [2120066.782223294, 6025144.500999055]]])); var pointsLayer = new ol.layer.Vector({ source: new ol.source.Vector({ features: [point] }), style: defaultStyle, name: 'Points Layer', id: "pointsLayer" }); map.addLayer(pointsLayer); var linesLayer = new ol.layer.Vector({ source: new ol.source.Vector({ features: [line] }), style: defaultStyle, name: 'Lines Layer', id: "linesLayer" }); map.addLayer(linesLayer); var polygonsLayer = new ol.layer.Vector({ source: new ol.source.Vector({ features: [polygon] }), style: defaultStyle, name: 'Polygons Layer', id: "polygonsLayer" }); map.addLayer(polygonsLayer); /** To project and store settings for a layer we use some Imajnet SDK functions * * @id {String} must be a unique value for a layer * @groundProjection {Boolean} if the layer is projected on the ground * @heightOffset {Float} offset for projected objects * * Lines layer will not be projected because it isn't added to the projected layers */ ImajnetProjection.addProjectedLayer({ id: pointsLayer.get('id'), groundProjection: true, heightOffset: 0 }); ImajnetProjection.addProjectedLayer({ id: polygonsLayer.get('id'), groundProjection: true, heightOffset: 0 }); } /** * Get map projections that will pe drawn on the image. * @param position - current imajnet position * @return {Object} A jquery deferred object that once resolved will return an array of objects */ ImajnetPlugin.getProjectionCandidates = function(position) { var result = jQuery.Deferred(); //Imajnet function that will get the constraint from which the features will be projected var constraintGeometry = ImageControler.currentPhotogrammetry.getProjectionConstraint(position); //{arse coordinates for(var i = 0; i < constraintGeometry.length; i++) { constraintGeometry[i] = ol.proj.transform([constraintGeometry[i].x, constraintGeometry[i].y], wgs84, webMercator); } var triangle = new ol.Feature(new ol.geom.Polygon([constraintGeometry])); // Build an array with all the layers we want to project var layers = new Array(); layers.push(getLayerByName('Points Layer')); layers.push(getLayerByName('Lines Layer')); layers.push(getLayerByName('Polygons Layer')); var format = new ol.format.GeoJSON(); var intersectedFeatures = new Array(); //loop over all the layers with features to project for(var layer in layers) { var features = layers[layer].getSource().getFeatures(); //Loop over the features and check if they are in the constraint geometry for(var i = 0; i < features.length; i++) { //An external library that checks for intersection between the feature and the constraint var intersection = turf.intersect(format.writeFeatureObject(triangle), format.writeFeatureObject(features[i])); //If an intersection is found add the feature to objects that need to be projected if(intersection) { var geometry = features[i].clone().getGeometry(); geometry.transform(webMercator, wgs84); var coordinates = geometry.getCoordinates(); var type = geometry.getType(); //The objects that will be projected must have a feature, a geometry(coordinates) a style and a layerId if(type === 'Point') { intersectedFeatures.push({ feature: features[i], geometry: new Array({ lon: coordinates[0], lat: coordinates[1] }), style: getStyleObjectForProjection(features[i]), layerId: layers[layer].get('id') }); } else if(type === 'LineString') { var pointsArray = new Array(); for(var k = 0; k < coordinates.length; k++) { pointsArray.push({ lon: coordinates[k][0], lat: coordinates[k][1] }) } intersectedFeatures.push({ feature: features[i], geometry: pointsArray, style: getStyleObjectForProjection(features[i]), layerId: layers[layer].get('id') }) } else if(type === 'Polygon') { var pointsArray = new Array(); coordinatesPolygon = coordinates[0]; for(var k = 0; k < coordinatesPolygon.length; k++) { pointsArray.push({ lon: coordinatesPolygon[k][0], lat: coordinatesPolygon[k][1] }) } intersectedFeatures.push({ feature: features[i], geometry: pointsArray, style: getStyleObjectForProjection(features[i]), layerId: layers[layer].get('id') }) } } } } result.resolve(intersectedFeatures); return result.promise(); }; function getStyleFromFeature(feature) { var style = feature.getStyle(); if(!style) { style = defaultStyle; } if(!jQuery.isArray(style)) { style = [style]; } return style; } //Function that will return the feature's style in to imajnet format so that it can be drawn in to the image function getStyleObjectForProjection(feature) { var featureStyles = getStyleFromFeature(feature); var styleProjections = new Array(); var type = feature.getGeometry().getType(); var fill = null; var stroke = null; jQuery.each(featureStyles, function(key, value) { if(type != "Point") { fill = value.getFill(); stroke = value.getStroke(); styleProjections.push({ strokeColor: stroke ? stroke.getColor() : '#000000', strokeLinecap: stroke.getLineCap(), strokeWidth: stroke ? stroke.getWidth() : 2, fill: fill ? fill.getColor() : null }) } else if(type === 'Point') { var style = {} image = value.getImage(); if(image instanceof ol.style.Icon) { style.externalGraphic = image.getSrc(); } else { fill = image.getFill(); stroke = image.getStroke(); var radius = image.getRadius(); } if(stroke) { style.strokeColor = stroke.getColor(); style.strokeWidth = stroke.getWidth(); } if(fill) { style.fillColor = fill.getColor(); style.fill = true; } if(image instanceof ol.style.RegularShape) { var points = image.getPoints(); var radius2 = image.getRadius2(); var angle = image.getAngle(); if(radius2 != radius) { points = points / 2; } if(points == 4) { if(radius2 == 0) { style.graphicName = 'cross'; } else { style.graphicName = 'square'; } } else if(points == 3) { style.graphicName = 'triangle'; } } style.pointRadius = radius; styleProjections.push(style) } }); return styleProjections; } //Helper functions to highlight the projections ImajnetPlugin.onFeatureMouseOver = function(featureWrapper) { highlightFeature(featureWrapper.getFeature()); }; ImajnetPlugin.onFeatureMouseOut = function(featureWrapper) { removeSelect(featureWrapper.getFeature()); }; function removeSelect(feature) { if(!feature.get('isSelected')) { return; } feature.getStyle().pop(); feature.setStyle(feature.getStyle()); feature.set('isSelected', false) } function highlightFeature(feature) { if(feature.get('isSelected')) { return; } var type = feature.getGeometry().getType(); var style = getStyleFromFeature(feature); style.push(selectStyle(type)); feature.setStyle(style); feature.set('isSelected', true); } function selectStyle(type) { if(type == 'Point') { return new ol.style.Style({ image: new ol.style.Circle({ radius: 6, fill: new ol.style.Fill({ color: 'rgba(52, 152, 219, 0.5)' }), stroke: new ol.style.Stroke({ color: 'blue', width: 3 }) }), zIndex: 999 }); } else if(type == 'LineString') { return new ol.style.Style({ stroke: new ol.style.Stroke({ color: 'rgba(52, 152, 219, 0.5)', width: 16 }), zIndex: 999 }); } else if(type == 'Polygon') { return new ol.style.Style({ stroke: new ol.style.Stroke({ color: 'rgba(0, 0, 255, 1)', width: 3 }), fill: new ol.style.Fill({ color: 'rgba(52, 152, 219, 0.5)' }), zIndex: 999 }); } }